home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / objects in c ƒ / Name Sources / Name.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-06  |  1.6 KB  |  87 lines  |  [TEXT/KAHL]

  1. /*    
  2.  *        Name abstract class
  3.  *
  4.  *        Generic name class. Used frequently with NameSpace &
  5.  *        CLisp Symbols. 
  6.  *
  7.  *        Instances created with the class method "new" form a 
  8.  *        proper set - the same name string will yield the same
  9.  *        Name object.  This allows == comparisons for name equality
  10.  *        rather than "equal".
  11.  *
  12.  *            Copyright © John Wainwright 1988
  13.  *
  14.  *    SuperClasses :
  15.  *                    String
  16.  *  Instance Vars :
  17.  *
  18.  *    Class Vars :
  19.  *                    nameSet
  20.  *    Methods :
  21.  *                    hashOf
  22.  *    Class Methods :
  23.  *                    declare s            - declare s as a Name - return
  24.  *                                          Name object for this string.
  25.  */
  26.  
  27. #include "oic.h"
  28. #include "generics.h"
  29. #include "names.h"
  30.  
  31. class         Name;                /* the Name class                 */
  32.  
  33. struct Name_c                    /* Name instance structure        */
  34. {
  35.     object    nameSet;            /* nameset hashtable            */
  36. };
  37. typedef struct Name_c Name_c;
  38.  
  39. /* -------------------- Name Instance methods ----------------- */
  40.  
  41. /* ---------------------- Name Class methods ------------------ */
  42.  
  43. method object
  44. _declare(class, cv, name)
  45.     class            class;
  46.     register Name_c    *cv;
  47.     register char    **name;
  48. {
  49.     register object    o, n;
  50.     
  51.     if (cv->nameSet == NULL)
  52.         cv->nameSet = New(HashTable, 127, 0);
  53.         
  54.     n = New(Name, *name);
  55.     o = get(cv->nameSet, n);
  56.     if (o == NULL)
  57.     {
  58.         bind(cv->nameSet, n, n);
  59.         return n;
  60.     }
  61.     else
  62.     {
  63.         dispose(n);
  64.         return o;
  65.     }
  66. }
  67.  
  68. /* ------------------- Init the Name class -------------------- */
  69.  
  70. InitNameClass()
  71. {
  72.     Name = NewClass(0, sizeof(Name_c), "Name", String, END);
  73.     AddClassMethods(Name,
  74.         declareGeneric,         _declare,
  75.         END);
  76. }
  77.  
  78. InitNameClasses()
  79. {
  80.     InitNameClass();
  81.     InitBindingClass();
  82.     InitHashTableClass();
  83.     InitNameSpaceClass();
  84.     InitNameMixinClass();
  85.     InitNameTable();
  86. }
  87.